#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
#include <assert.h>

void SL_Init(SL *ps)
{
    ps->size = 0;       // 有效数据个数为0
    ps->capacity = 0;   // 容量为0
    ps->arr = NULL;     // 指针为空
}
 
// 检查容量, 并在需要扩容时扩容
void SL_CheckCapacity(SL *ps)
{
    if (ps->size == ps->capacity)
    {
        int capacity_new = ps->capacity == 0 ? 4 : 2 * ps->capacity;
        // 判断容量是否为空 空则给4, 并以每次2倍提升容量
        SLDataType *ptmp = (SLDataType *)realloc(ps->arr, capacity_new * sizeof(SLDataType));
        // 判断是否创建成功
        if (ptmp == NULL)
        {
            perror("realloc fail!");
            exit(1);
        }
        // 扩容成功
        ps->arr = ptmp;
        ps->capacity = capacity_new;
    }
}

// 尾插
void SL_Pushback(SL *ps, SLDataType x)
{
    /* 断言 粗暴版 */
    assert(ps); 
    /* 判断温柔版
    if (ps == NULL)
    {
        return;
    }
     */
    // 空间不够, 扩容
    // 空间足够, 继续
    SL_CheckCapacity(ps);
    // 插入数据
    ps->arr[ps->size++] = x;
}

// 头插
void SL_Pushfront(SL *ps, SLDataType x)
{
    /* 断言 粗暴版 */
    assert(ps); 
    /* 判断温柔版
    if (ps == NULL)
    {
        return;
    }
     */
    // 空间不够, 扩容
    // 空间足够, 继续
    SL_CheckCapacity(ps);
    // 插入数据
    for (int i = ps->size; i > 0; i--)
    {
        ps->arr[i] = ps->arr[i - 1];
    }
    ps->arr[0] = x;
    ps->size++;
}


// 指定位置插入数据
void SL_Insert(SL *ps, int p, SLDataType x)
{
    assert(ps);
    assert(p >= 0 && p < ps->size);
    SL_CheckCapacity(ps);
    // 及那个p后面的数据都往后移动一位, 插入p
    for (int i = ps->size; i > p; i--)
    {
        ps->arr[i] = ps->arr[i -  1];
    }
    ps->arr[p] = x;
    ps->size++;
}

// 尾删
/* 
 * - 有数据, 直接删除
 * - 无数据, 不能删除
 */
void SL_Popback(SL *ps)
{
    assert(ps);
    assert(ps->size);
    ps->size--;
}

// 指定位置删除
void SLErase(SL *ps, int p)
{
    assert(ps);
    assert(p >= 0 && p < ps->size);

    for (int i  = p; i < ps->size - 1; i++)
    {
        ps->arr[i] = ps->arr[i + 1];
    }
    ps->size--;
}

// 头删
/* 
 * - 有数据, 直接删除
 * - 无数据, 不能删除
 */
void SL_popfront(SL *ps)
{
    assert(ps);
    assert(ps->size);
    for (int i = 0; i < ps->size - 1; i++)
    {
        ps->arr[i] = ps->arr[i + 1]; 
    }
    ps->size--;
}


// 打印
void SL_Print(SL *ps)
{
    for (int i = 0; i < ps->size; i++)
    {
        printf("%d ", ps->arr[i]);
    }
    printf("\n");
}

// 在顺序表中查找x
// find ret idex / not find ret -1
/* int SL_find(SL *ps, int x)
{
    assert(ps);
    for (int i = 0; i < ps->size; i++)
    {
        if (ps->arr[i] == x)
        {
            return i;
        }
    }
    return -1;
} */

// 销毁顺序表
void SL_destory(SL *ps)
{
    assert(ps);
    if (ps->arr)
    {
    free(ps->arr);
    }
    ps->arr = NULL;
    ps->size = 0;
    ps->capacity = 0;
}

// 修改指定位置值为x
/* void SL_modify(SL *ps, int i, int x)
{
    assert(ps);
    assert(i >= 0 && i < ps->size);
    ps->arr[i] = x;
} */